package com.wei.czz.framework.blog.controller;

import java.util.List;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.blog.tag.TagDto;
import com.wei.czz.common.dto.blog.tag.TagEnumsDto;
import com.wei.czz.common.jsr303.group.OrderSearch;
import com.wei.czz.common.jsr303.group.Save;
import com.wei.czz.common.jsr303.group.Update;
import com.wei.czz.common.property.BatchProperty;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.blog.tag.TagVo;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.common.vo.blog.tag.TagFormVo;
import com.wei.czz.framework.blog.manager.TagManager;
import com.wei.czz.framework.blog.service.TagService;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2021-03-15 10:29:26
 * className: TagController 博客标签操作请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/blog/tag")
@AllArgsConstructor
public class TagController {

    private static final Logger log = LoggerFactory.getLogger(TagController.class);

    private final BatchProperty batchProperty;

    private final TagManager tagManager;

    private final TagService tagService;

    /**
     * 保存博客标签接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-标签管理页面-标签操作框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param tagVo 标签信息对象
     */
    @Resubmit(spEL = "'saveTag' + #userId", message = "保存博客标签")
    @PostMapping("/save")
    @Auth(permit = "tag:save")
    public Result<Object> saveTag(@Validated(Save.class) @RequestBody TagVo tagVo){
        log.info("开始保存博客标签业务。{}", tagVo);

        tagManager.save(tagVo);

        log.info("保存博客标签业务结束");
        return Result.success();
    }

    /**
     * 分页查询博客标签列表接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客标签页面调用
     * @param tagFormVo 标签检索信息对象
     */
    @PostMapping("/page/list")
    @Auth(permit = "tag:list")
    public Result<PageDto<TagDto>> getPageTagList(@Validated(OrderSearch.class) @RequestBody TagFormVo tagFormVo){
        log.info("开始分页查询博客标签列表业务。{}", tagFormVo);

        PageDto<TagDto> page = tagManager.getPageList(tagFormVo);

        log.info("分页查询博客标签列表业务结束");
        return Result.success(page);
    }

    /**
     * 获取博客标签接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-标签操作框调用
     * @param id 标签主键
     */
    @GetMapping("/info")
    @Auth(permit = "tag:get")
    public Result<TagDto> getTagInfo(@RequestParam("id") Long id){
        log.info("开始获取标签信息业务。id={}", id);

        TagDto tag = tagManager.getTag(id);

        log.info("获取标签信息业务结束");
        return Result.success(tag);
    }

    /**
     * 获取博客标签枚举数据接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-标签管理页面调用
     * @return 标签相关枚举列表
     */
    @GetMapping("/enums")
    @Auth(permit = "tag:list")
    public Result<TagEnumsDto> getPageEnum() {
        log.info("开始获取博客标签枚举数据业务");
        TagEnumsDto tagEnumsDto = tagManager.getPageEnum();
        log.info("获取博客标签枚举数据业务结束");
        return Result.success(tagEnumsDto);
    }

    /**
     * 获取博客标签下一个默认排序等级接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页-博客标签管理页-博客标签添加/修改弹出框调用
     * @return 下一个默认排序等级
     */
    @GetMapping("/next/sort")
    @Auth(permit = { "tag:save", "tag:update"})
    public Result<Integer> getNextSort() {
        log.info("开始获取博客标签下一个默认排序等级业务");
        Integer nextSort = tagService.getNextSort();
        log.info("获取博客标签下一个默认排序等级业务结束");
        return Result.success(nextSort);
    }

    /**
     * 修改博客标签接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-标签管理页面-标签操作框中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param tagVo 标签参数对象
     */
    @Resubmit(spEL = "'updateTag' + #userId", message = "修改博客标签")
    @RequestMapping("/update")
    @Auth(permit = "tag:update")
    public Result<Object> updateTag(@Validated(Update.class) @RequestBody TagVo tagVo) {
        log.info("开始修改博客标签业务。{}", tagVo);

        tagManager.updateTag(tagVo);

        log.info("修改博客标签业务结束");
        return Result.success();
    }

    /**
     * 更新博客标签状态接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-标签管理页面调用
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     */
    @Resubmit(spEL = "'updateTagStatus' + #userId", message = "更新博客标签状态")
    @PostMapping("/update/status")
    @Auth(permit = "tag:update")
    public Result<Object> updateTagStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始更新博客标签状态业务。{}", updateStatusVo);

        tagManager.updateTagStatus(updateStatusVo);

        log.info("更新博客标签状态业务结束");
        return Result.success();
    }

    /**
     * 删除博客标签接口
     * <p>
     * 调用方：
     *  1、浏览器-后台管理页面-博客标签管理页面调用
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 主键列表
     */
    @Resubmit(spEL = "'deleteTag' + #userId", message = "删除博客标签信息")
    @RequestMapping("/delete")
    @Auth(permit = "tag:delete")
    public Result<Object> deleteTag(@RequestBody List<Long> idList){
        log.info("开始删除博客标签业务。{}", idList);

        if (idList.isEmpty()) {
            log.info("删除标签信息接口，请求参数错误");
            return Result.paramFail();
        }
        if (batchProperty.getMaxSize() < idList.size()) {
            log.info("删除博客标签数量超限");
            return Result.clientFail("一次删除博客标签数量至多允许同时删除" + batchProperty.getMaxSize() + "个标签");
        }

        tagManager.deleteTag(idList);

        log.info("删除博客标签业务结束");
        return Result.success();
    }

}
